package com.jzo2o.orders.manager.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.orders.dto.request.OrderCancelReqDTO;
import com.jzo2o.api.orders.dto.response.OrderResDTO;
import com.jzo2o.api.orders.dto.response.OrderSimpleResDTO;
import com.jzo2o.api.trade.dto.response.ExecutionResultResDTO;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.manager.model.dto.OrderCancelDTO;
import com.jzo2o.orders.manager.model.dto.request.OrderPageQueryReqDTO;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author itcast
 * @since 2023-07-10
 */
public interface IOrdersManagerService extends IService<Orders> {

    /**
     * @param ids
     * @return
     */
    List<Orders> batchQuery(List<Long> ids);

    Orders queryById(Long id);

    /**
     * 滚动分页查询
     * @param currentUserId 当前用户id
     * @param ordersStatus  订单状态，0：待支付，100：派单中，200：待服务，300：服务中，400：待评价，500：订单完成，600：已取消，700：已关闭
     * @param sortBy        排序字段
     * @return 订单列表
     */
    List<OrderSimpleResDTO> consumerQueryList(Long currentUserId, Integer ordersStatus, Long sortBy);


    /**
     * 根据订单id查询
     *
     * @param id 订单id
     * @return 订单详情
     */
    OrderResDTO getDetail(Long id);
    /**
     * 订单评价
     *
     * @param ordersId 订单id
     */
    void evaluationOrder(Long ordersId);

    /**
     * 查询超时未支付的订单
     * @param count
     * @return
     */
    List<Orders> queryOverTimeNoPayOrdersByCount(int count);

    /**
     * 取消超时未支付的订单
     * @param dto
     */
    void cancelNoPayOrder(OrderCancelDTO dto);

    /**
     * 取消订单
     * @param dto
     */
    void cancel(OrderCancelReqDTO dto);

    /**
     * 取消已支付派单中的订单
     * @param orderCancelDto
     */
    void cancelDispatchingOrder(OrderCancelDTO orderCancelDto);

    /**
     * 处理退款后的结果
     * @param res
     * @param ordersId
     */
    void refundOrder(ExecutionResultResDTO res, Long ordersId);

    /**
     * 申请退款
     * @param ordersId
     * @param realPayAmount
     * @param tradingOrderNo
     */
    void requestRefundOrder(Long ordersId, BigDecimal realPayAmount, Long tradingOrderNo);

    /**
     * 分页查询订单列表
     * @param pageQuery
     * @return
     */
    PageResult<OrderSimpleResDTO> pageQuery(OrderPageQueryReqDTO pageQuery);


    /**
     * 取消未支付订单，并退回优惠券
     * @param orderCancelDto
     */
    void cancelNoPayOrderByUseCoupon(OrderCancelDTO orderCancelDto);
    /**
     * 取消派单中已支付的订单,并退回优惠券
     * @param orderCancelDto
     */
    void cancelDispatchingOrderByUseCoupon(OrderCancelDTO orderCancelDto);
}
